package cn.itsource.template;

import cn.hutool.http.HttpUtil;
import cn.itsource.dto.OpenIdResultDto;
import cn.itsource.properties.WeChatProperties;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.Assert;


public class WechatTemplate {

    private WeChatProperties weChatProperties;



    public WechatTemplate(WeChatProperties weChatProperties){

        this.weChatProperties = weChatProperties;


    }



    /**
     * 创建拿到openid的方法
     * 根据code
     * @return
     */
    public String codeToOpenId(String OpenIdCode){

//获取到openid https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
        String url = String.format(weChatProperties.getOpenIdUrlTemplate(), weChatProperties.getAppId(), weChatProperties.getSecret(), OpenIdCode);
        //发送请求
        String resultJson = HttpUtil.get(url);

        //判断校验为false 如果为true就抛出这个异常
        //resultJson.contains("errCode") 存在就是true  ,这里Spring自己是没有isFalse的 所以用的是isTrue所以这里是要取反
        Assert.isTrue(!resultJson.contains("errCode"),"获取openid失败!"); //这里是利用断言来做判断

        //AssertUtil.isFalse(resultJson.contains("errCode"), GlobalExceptionCode.WECHAT_REGISTER_ERROR);

        OpenIdResultDto openIdResultDto = JSONObject.parseObject(resultJson, OpenIdResultDto.class); //转为JSON字符串
        String openid = openIdResultDto.getOpenid(); //拿到openid
        return openid;
    }


    /**
     * 这是根据phoneCode拿到手机号
     * @param phoneCode
     * @return
     */
    public String codeToPhone(String phoneCode) {
        //先要获取到access_token
        //拼接好地址
        String url = String.format(weChatProperties.getAccessTokenUrlTemplate(), weChatProperties.getAppId(), weChatProperties.getSecret());
        String resultJsonStr = HttpUtil.get(url);

        //这个里面有errcode就抛出一个系统异常
     //   AssertUtil.isFalse(resultJsonStr.contains("errCode"), GlobalExceptionCode.WECHAT_REGISTER_ERROR);
       Assert.isTrue(!resultJsonStr.contains("errCode"), "获取accessToken失败!");
        //企业在接收参数的时候 有三种方法: 1.封装成dto对象接收参数  2.封装成map  3.封装成JSONObject:这个也是一个key:value结构的
        JSONObject jsonObject = JSONObject.parseObject(resultJsonStr);
        String accessToken = jsonObject.getString("access_token");

        //再根据access_token + phoneCode 拿到手机号
        String phoneUrl = String.format(weChatProperties.getCodeToPhoneUrlTemplate(), accessToken);
        JSONObject param = new JSONObject();
        param.put("code",phoneCode);

        String phoneResultJsonStr = HttpUtil.post(phoneUrl, JSONObject.toJSONString(param));

        //判断有没有问题 没有问题再转换成JSONobj对象
        Assert.isTrue(!phoneResultJsonStr.contains("errCode"),"获取手机号失败");
        // AssertUtil.isFalse(phoneResultJsonStr.contains("errCode"), GlobalExceptionCode.WECHAT_REGISTER_ERROR);

        //phoneResultJsonStr 转换为Json对象
        JSONObject phoneResultJsonObj = JSONObject.parseObject(phoneResultJsonStr);

        //phoneResultJsonObj 拿到这个phone_info对象
        String phoneInfo = phoneResultJsonObj.getString("phone_info");
        //phoneInfo转为JSONobj对象
        JSONObject phoneInfoJsonObj = JSONObject.parseObject(phoneInfo);
        //最后拿到手机号码
        String phoneNumber = phoneInfoJsonObj.getString("phoneNumber");


        return phoneNumber;
    }


}
